package com.ato.java;

/**
 * @author wangjing
 * @create 2021--07--18--20:24
 */

/**
 * 多态
 * 一个事物的多种表现形态
 * 对象的多态性：
 * 父类的引用指向子类的对象  或者说 子类的对象赋值给父类引用
 * <p>
 * 在编译期间，只能调用父类的方法，在执行期间：调用的是子类重写父类的方法
 * 编译看左边， 执行看右边
 * 使用前提：
 * 1；类的继承关系
 * 2：一定是子类重写父类的方法
 * 为什么要用多态性
 *
 * 注意了：！！！！！！  多态只使用与方法！！！！！！！
 *
 *  不能调用子类特有的方法（子类自己的，没有重写父类的）：因为编译时 是看左边，看到的还是Person 父类，
 *
 *  那么如何才能调用子类特有的方法呢
 *  1：使用强转：
 *      Person p2 = new Person;
 *      Man m1 = (Man)p2;  // 向下转型 ；  子类转父类就是向上转型
 *      强转有风险！！！
 *      因此 引入了关键字：instanceof
 *
 *      a instanceof A   判断a是否为A的实例 是 返回true
 *
 *      因此转换前先判断。在转。
 *
 */
public class DuoTai {

    public static void main(String[] args) {
//        正常使用类的实例化对象
        Persons p1 = new Persons();
        p1.eat();
        System.out.println("***************多态*******************");
//        通过多态创建的类的实例化对象：子类对象的多态性：父类的引用指向子类的对象
        Persons p2 = new Man();
//        多态的使用
        p2.eat();//  调用父类同名同参的方法时，调用的的是子类重写父类的方法：称之为：  虚拟方法调用
//*********************************** 多态的使用  ***************************
        /*
            传入参数时，传的是父类，但是比如我在调用时， 是需要分别调用子类重写的方法，那么我传实参时，就不用传入父类，
            而是要调用哪个子类重写的方法就放入哪个子类做实参
         */

        System.out.println("**************** 多态的使用 *******************************");


        DuoTai d1 = new DuoTai();
        d1.tt(new Woman());
        d1.tt(new Man());

    }


    public void tt(Persons ps) {
        ps.eat();
    }

    ;
}


class Persons {
    String name;

    public void eat() {
        System.out.println("这是父类的eat方法");
    }
}

class Woman extends Persons {
    String women_name;

    public void eat() {
        System.out.println("这是子类重写的父类的方法：女人要减肥");
    }
}

class Man extends Persons {
    String man_name;

    public void eat() {
        System.out.println("这是子类重写的父类的方法：男人要多吃");
    }
}
